#include<bits/stdc++.h>
using namespace std;
const int N=3005,mod=1e9+7;
namespace IO{
    const int BUF=1<<21;
    char buff[BUF],*p1=buff,*p2=buff;
    #define gc() (p1==p2&&(p2=((p1=buff)+fread(buff,1,BUF,stdin)),p1==p2)?EOF:*p1++)
    template<typename T>inline void read(T &x){
        char ch=gc();x=0;int f=1;
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
        x*=f;
    }
}
using namespace IO;
int n,k,cnt,f[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char s[N][N];
int vis[N][N],vis1[N][N];
unordered_map<long long,int> vis2;
inline int id(int x,int y){return (x-1)*n+y-1;}
inline bool ok(int x,int y){return x>0&&x<=n&&y>0&&y<=n&&!vis[x][y]&&s[x][y]=='.';}
int main(){
	freopen("brick.in","r",stdin);
	freopen("brick.out","w",stdout); 
	read(n),read(k);
	for(int i=1;i<=n;++i)
	for(int j=1;j<=n;++j){
		s[i][j]=gc();
		while(s[i][j]!='#'&&s[i][j]!='.') s[i][j]=gc();
	}
	for(int i=1;i<=n;++i)
	for(int j=1;j<=n;++j)if(s[i][j]=='#'){
		for(int d=0;d<4;++d){
			int x=i+f[d][0],y=j+f[d][1];
			if(ok(x,y)){
				vis[x][y]=1;
				++cnt;
			}
		}
	}
	if(k==1) return cout<<cnt,0;
	if(k==2){
		long long ans=1ll*cnt*(cnt-1)/2%mod;
		for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)if(vis[i][j]){
			for(int d=0;d<4;++d){
				int x=i+f[d][0],y=j+f[d][1];
				if(ok(x,y))
					++ans;
			}
		}
		return cout<<ans%mod,0;
	}
	if(k==3){
		long long ans=(__int128)cnt*(cnt-1)*(cnt-2)/6%mod;
		for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)if(vis[i][j]){
			for(int d=0;d<4;++d){
				int x=i+f[d][0],y=j+f[d][1];
				if(ok(x,y)){
					(ans+=cnt-(++vis1[x][y]))%=mod;
					for(int d1=0;d1<4;++d1){
						int x1=x+f[d1][0],y1=y+f[d1][1];
						if(ok(x1,y1)) ++ans;
					}
					for(int d1=d+1;d1<4;++d1){
						int x1=i+f[d1][0],y1=j+f[d1][1];
						if(ok(x1,y1)) ++ans;
					}
				}
			}
		}
		return cout<<ans%mod,0;
	}
//	if(k==4){
//		long long ans=(__int128)cnt*(cnt-1)*(cnt-2)*(cnt-3)/24%mod;
//		int sum=0;
//		for(int i=1;i<=n;++i)
//		for(int j=1;j<=n;++j)if(vis[i][j]){
//			int now=0;
//			for(int d=0;d<4;++d){
//				int x=i+f[d][0],y=j+f[d][1];
//				if(ok(x,y)){
//					++now;
//					(ans+=sum-vis1[x][y])%=mod;//2-1-1
//					++vis1[x][y];
//					(ans+=1ll*(cnt-vis1[x][y])*(cnt-vis1[x][y]-1)/2)%=mod;//3-1
//					
//					for(int d1=0;d1<4;++d1){
//						int x1=x+f[d1][0],y1=y+f[d1][1];
//						if(ok(x1,y1)){
//							int a=id(x,y),b=id(x1,y1);
//							if(a>b) swap(a,b);
//						//	cout<<i<<' '<<j<<' '<<1ll*a*n*n+b<<'\n';
//							int c=++vis2[1ll*a*n*n+b];
//							(ans+=cnt-c-(c-1))%=mod;
//						}
//					}//2-2 l
//					
//					for(int d1=d+1;d1<4;++d1){
//						int x1=i+f[d1][0],y1=j+f[d1][1];
//						if(ok(x1,y1)){
//							int a=id(x,y),b=id(x1,y1);
//							if(a>b) swap(a,b);
//						//	cout<<'b'<<i<<' '<<j<<' '<<1ll*a*n*n+b<<'\n';
//							int c=++vis2[1ll*a*n*n+b];
//							(ans+=cnt-c-(c-1))%=mod;
//						}
//					}//2-2 k
//					int pre=ans;
//					for(int d1=0;d1<4;++d1){
//						int x1=x+f[d1][0],y1=y+f[d1][1],cn=0;
//						if(ok(x1,y1)){
//							for(int d2=0;d2<4;++d2){
//								int x2=x1+f[d2][0],y2=y1+f[d2][1];
//								if(ok(x2,y2)&&(x2!=x||y2!=y)&&abs(i-x2)+abs(j-y2)!=1) ++ans,cerr<<i<<' '<<j<<' '<<x<<' '<<y<<' '<<x1<<' '<<y1<<' '<<x2<<' '<<y2<<'\n';
//							}
//							++cn;
//						}
//						(ans+=cn*(cn-1)/2)%=mod;
//					}//1-3 l
//				cerr<<i<<' '<<j<<' '<<ans-pre<<'\n';
//					for(int d1=d+1;d1<4;++d1){
//						int x1=i+f[d1][0],y1=j+f[d1][1];
//						if(ok(x1,y1)){
//							for(int d2=0;d2<4;++d2){
//								int x2=x+f[d2][0],y2=y+f[d2][1];
//								if(ok(x2,y2)) ++ans;
//							
//							}// 1-(1+1)-1
//							for(int d2=0;d2<4;++d2){
//								int x2=x1+f[d2][0],y2=y1+f[d2][1];
//								if(ok(x2,y2)&&abs(x2-x)+abs(y2-y)!=1) ++ans;	
//					
//							}//1-1-(1+1)
//						}
//					}//1- 1+2
//				
//					for(int d1=d+1;d1<4;++d1){
//						int x1=i+f[d1][0],y1=j+f[d1][1];
//						if(ok(x1,y1)){
//							for(int d2=d1+1;d2<4;++d2){
//								int x2=i+f[d2][0],y2=j+f[d2][1];
//								if(ok(x2,y2)) ++ans;
//							}
//						}
//					}//1-1-1
//				}
//			}
//			sum+=now;
//		}
//		return cout<<ans%mod,0;
//	}
	return 0;
}


